//
//  HMSinaOAuthViewController.swift
//  ZJCSina
//
//  Created by 朱建超 on 16/11/15.
//  Copyright © 2016年 itHeiMa. All rights reserved.
//

//展示登录的网页

import UIKit
//导入模块，用户等待指示器
import SVProgressHUD

//OC中有多继承吗？如果没有，使用什么来替代？
//没有，使用协议来替代
class HMSinaOAuthViewController: UIViewController {

    //定义属性
    let webView = UIWebView()
    
    //自定义根视图
    override func loadView() {
        view = webView
        
        //指定代理
        webView.delegate = self
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "关闭", target: self, action: #selector(close))
        
        //在应用发布的时候，千万要注意一定要注销
        self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "走后门" , target: self, action: #selector(autoLogin))
        
        //设置背景颜色，使用手写代码创建的控制器的背景颜色是透明的
        self.view.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
        
        //请求授权页面
        loadOAuthPage()
        
        //在本类中无法调用分类中的私有方法
        
    }

    private func loadOAuthPage(){
    
        //https://api.weibo.com/oauth2/authorize?client_id=123050457758183&redirect_uri=http://www.example.com
        
        let urlString = "https://api.weibo.com/oauth2/authorize?" + "client_id=" + client_id + "&redirect_uri=" + redirect_uri
        
        let url = URL(string: urlString)
        
        let request = URLRequest(url: url!)
        
        webView.loadRequest(request)
    
    }
    
    //走后门的代码
    /*
     "document.getElementById('userId').value = '账号',document.getElementById('passwd').value = '密码'"
     */
    @objc private func autoLogin() {
        
        let loginString = "document.getElementById('userId').value = '17317278139',document.getElementById('passwd').value = 'zjc19891119'"
        
        webView.stringByEvaluatingJavaScript(from: loginString)
        
        
    }
    
    @objc private func close() {
        
        dismiss(animated: true, completion: nil)
        
    }

    //在页面关闭的时候dismiss掉用户读取的指示器
    override func viewWillDisappear(_ animated: Bool) {
        
        super.viewWillDisappear(animated)
        SVProgressHUD.dismiss()
        
    }
   
    
}

//将代理方法抽取到分类中实现，将模块的功能独立出来，更加好维护
extension HMSinaOAuthViewController : UIWebViewDelegate{

    //MARK:实现协议的方法
    func webViewDidStartLoad(_ webView: UIWebView) {
        
        SVProgressHUD.show()
        
    }
    
    func webViewDidFinishLoad(_ webView: UIWebView) {
        
        SVProgressHUD.dismiss()
        
    }
    
    //一般协议方法返回值为bool类型，如果返回为true,就可以正常工作，否则不能正常工作
    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        
        //http://www.itheima.com/?code=acb21547cff4e0fd7c49102ded938621
        
        let urlString = request.url?.absoluteString ?? ""
        
        //判断ureString中是否包含了特殊的标记，如果包含，就可以截取code
        
        let flag = "code="
        
        if urlString.contains(flag) {
            
            //能够截取code
            let query = request.url?.query ?? ""
            
            let code = (query as NSString).substring(from: flag.characters.count)
            
            print("---->\(code)")
            
            //获取了code之后就应该使用code获取用户的token（访问接口的唯一标识）
            //如果获取了code之后，就应该return false,不加载页面
            
            //return false之后，就不会跳转到itheima的页面
            //获取token
            HMSinaUserAccountViewModel.shared.loadAccesstoken(code: code, finished: { (isSuccess) in
                
                if isSuccess == false {
                
                    SVProgressHUD.showError(withStatus: "世界上最遥远的距离就是没有网络")
                    return
                
                }
                
                //请求成功
                print("请求成功")
                
                //切换根视图控制器
//                UIApplication.shared.keyWindow?.rootViewController = HMSinaWelComeController()
                
                //object：表示哪个对象发通知，通常用来传参数的
                NotificationCenter.default.post(name: NSNotification.Name(chooseRootViewController), object: "Welcome")
                
            })
            
            return false
        }
        
        return true
        
    }
    
    //以下这些代码被封装到HMSinaUserAccountViewModel中
    
//    //获取用户token的方法
//    private func loadAccesstoken(code : String) {
//        
//        //https://api.weibo.com/oauth2/access_token
//        
//        let urlString = "https://api.weibo.com/oauth2/access_token"
//        
//        let parameters = ["client_id" : client_id,
//                          "client_secret" : client_secret,
//                          "grant_type" : "authorization_code",
//                          "code" : code,
//                          "redirect_uri" : redirect_uri]
//        
//        HMNetworkTools.shared.request(method: .POST, urlString: urlString, parameters: parameters) { (responseObject, error) in
//            
//            if error != nil{
//            
//                SVProgressHUD.showError(withStatus: "世界上最遥远的距离就是没有网络")
//                
//                return
//            
//            } 
//            
//            //使用access_token和uid来获取用户信息
//            self.loadUserInfo(dict: responseObject as! [String : Any])
//            
//        }
//        
//    }
//    
//    
//    //获取用户信息的方法
//    private func loadUserInfo(dict : [String : Any]) {
//        
//        let urlString = "https://api.weibo.com/2/users/show.json"
//        
//        let token = dict["access_token"]
//        let uid = dict["uid"]
//        
//        let parameters = ["access_token" : token,
//                          "uid" : uid]
//        
//        HMNetworkTools.shared.request(method: .GET, urlString: urlString, parameters: parameters) { (responseObject, error) in
//            
//            if error != nil{
//                
//                SVProgressHUD.showError(withStatus: "世界上最遥远的距离就是没有网络")
//            
//                return
//            
//            }
//            
//            //将用户信息存储在本地
//            //需要将授权后得到的字典和用户信息字典合并，之后再存储
//            var userInfoDict = responseObject as! [String : Any]
//            
//            for (key,value) in dict {
//                
//                userInfoDict[key] = value
//                
//            }
//            
//            //需要将userInforDict转换为模型对象
//            //使用归档的方式存储自定义模型对象
//            //字典转模型
//            let userAccount = HMSinaUserAccount(dict: userInfoDict)
//            
//            self.saveUserAccountInfo(userAccountInfo: userAccount)
//            
//            let userAccountInfo = self.loadUserAccountInfo()
//            
//            print(userAccountInfo ?? 0)
//            
//         
//        }
//        
//    }
//    
//    //存储模型对象
//    private func saveUserAccountInfo(userAccountInfo : HMSinaUserAccount) {
//        
//        //存储在沙盒的Document或者Library
//        //拼接文件路径的方法，String没有，需要转换为NSString
//        //使用默认转换的前提是：被转换的类型不能是可选类型
//        let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory , .userDomainMask , true).last! as NSString).appendingPathComponent("account.plist")
//        
//        //存储自定义对象，自定义对象必须遵守NSCoding协议，实现协议的方法
//        NSKeyedArchiver.archiveRootObject(userAccountInfo, toFile: path)
//        
//        print(path)
//        
//    }
//    
//    //解档用户信息的方法
//    private func loadUserAccountInfo() -> HMSinaUserAccount?{
//        
//        let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("account.plist")
//        
//        let userAccountInfo = NSKeyedUnarchiver.unarchiveObject(withFile: path)
//        
//        if let userAccountInfo = userAccountInfo as? HMSinaUserAccount {
//            
//            return userAccountInfo
//            
//        }
//        return nil
//    }
 

}
